package com.koala.javaBase.senior.day26;

import org.junit.jupiter.api.Test;

import java.lang.reflect.Method;

/**
 * Create by koala on 2021-01-10
 *
 * 如何操作运行时类中的指定的方法 -- 需要掌握
 *
 */
public class ReflectionTest07 {

    @Test
    public void testMethod() throws Exception {
        Class clazz = Person01.class;

        //创建运行时类的对象
        Person01 p = (Person01) clazz.newInstance();

        /*
        1.获取指定的某个方法
        getDeclaredMethod():参数1 ：指明获取的方法的名称  参数2：指明获取的方法的形参列表
         */
        Method show = clazz.getDeclaredMethod("show", String.class);
        //2.保证当前方法是可访问的
        show.setAccessible(true);

        /*
        3. 调用方法的invoke():参数1：方法的调用者  参数2：给方法形参赋值的实参
        invoke()的返回值即为对应类中调用的方法的返回值。
         */
        Object returnValue = show.invoke(p,"CHN"); //String nation = p.show("CHN");
        System.out.println(returnValue);

        System.out.println("*************如何调用静态方法*****************");

        // private static void showDesc()

        Method showDesc = clazz.getDeclaredMethod("showDesc");
        showDesc.setAccessible(true);
        //如果调用的运行时类中的方法没有返回值，则此invoke()返回null
        //Object returnVal = showDesc.invoke(null);
        Object returnVal = showDesc.invoke(Person01.class);
        System.out.println(returnVal);//null
    }

}
